#include <typescommon.h>
#include <genrand.h>
#include <pthread.h>
// 提前介绍linux的pthread多线程。因为数据结构在多线程需要锁。在clearn.v2.002.07也有用到。
// 被锁住的过程，不要return等退出。否则会死锁。
// 锁过程要短。
// 尽量不要锁内还有锁。
// locka lockb unlocka unlockb可能死锁。
// locka lockb unlockb unlocka到没问题。
static int globalValue = 0;
static pthread_mutex_t globalMutex;// = PTHREAD_MUTEX_INITIALIZER;可以通过PTHREAD_MUTEX_INITIALIZER直接初始化
static pthread_mutex_t globalMutex1 = PTHREAD_MUTEX_INITIALIZER;//可以通过PTHREAD_MUTEX_INITIALIZER直接初始化
// 这里介绍死锁。
#define MUTEX_CHECK_COUNT 1000
void *functionThread(void *vp)
{
    logdebug("thread begin");
    while(globalValue < MUTEX_CHECK_COUNT)
    {
        pthread_mutex_lock(&globalMutex);//锁
        pthread_mutex_lock(&globalMutex1);//锁
        logdebug("%s, value=%d", __func__, globalValue++);
        pthread_mutex_unlock(&globalMutex);//解锁
        pthread_mutex_unlock(&globalMutex1);//解锁
    }
    return NULL;
}

int main(int argc, char **argv)
{
    pthread_t tmpfd;
    logdebug("main begin");
    pthread_mutex_init(&globalMutex, NULL);//初始化互斥锁。-用PTHREAD_MUTEX_INITIALIZER也可以直接初始化。
    pthread_create(&tmpfd, NULL, functionThread, NULL);
    while(globalValue < MUTEX_CHECK_COUNT)
    {
        pthread_mutex_lock(&globalMutex1);//锁
        pthread_mutex_lock(&globalMutex);//锁
        logdebug("%s, value=%d", __func__, globalValue++);
        pthread_mutex_unlock(&globalMutex1);//解锁
        pthread_mutex_unlock(&globalMutex);//解锁
    }
    pthread_join(tmpfd, NULL);//等待子线程结束。
    pthread_mutex_destroy(&globalMutex);//释放锁。
    pthread_mutex_destroy(&globalMutex1);
    return 1;
}

// 死锁
